package com.sptpc.demo.controller;


import com.sptpc.demo.controller.requests.ModifyDrinkRequest;
import com.sptpc.demo.model.Drink;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
import org.springframework.http.HttpRequest;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.io.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/drink")
public class DrinkController {

    //get /drink/
    @GetMapping("/")
    public List<Drink> getAll() {
        //mock数据 - 后期从数据库查询
        List<Drink> results = new ArrayList<>();
        results.add(Drink.builder().id(1)
                .name("茉莉花茶")
                .price(Money.parse("USD 8.00"))
                .build());
        results.add(Drink.builder().id(2)
                .name("拿铁")
                .price(Money.parse("USD 8.00"))
                .build());

        return  results;
    }

    //日志
    //  get /drink/4
    //  path路径表时方法 id=4
    @GetMapping("/{id}")
    public Drink getDrink(@PathVariable("id") Integer id){
        log.info("查询饮品的id:{}",id);
        //后期从数据库查询

        Drink drink= Drink.builder().id(1)
                .name("茉莉花茶")
                .price(Money.parse("USD 8.00"))
                .build();
        return drink;
    }

    /**
     * 新增
     * post /drink/ {"name":"奶茶“,”price“:8.00}
     * 1.直接使用model类接受用户参数
     * 2.编写一个TO类专门负责传值
     */
    @PostMapping("/")
    public Drink addNewDrink(@RequestBody @Valid Drink drink,
                             BindingResult result){
        if (result.hasErrors()){
            for (ObjectError error : result.getAllErrors()) {
                log.error(error.toString());
            }
            return null;
        }else {
            log.info("创建新饮品:{},drink");
            //后期使用数据库insert
            Drink adddrink= Drink.builder().id(1)
                    .name("茉莉花茶")
                    .price(Money.parse("USD 8.00"))
                    .build();
            return adddrink;
        }


    }

    /**
     * 修改
     * put /drink/ {"id":1,"name":"新奶茶","price":15.00}
     */
    @PutMapping("/")
    public Drink modifyDrink(@RequestBody ModifyDrinkRequest request){
        log.info("要修改的饮品：{}",request);
        //后期使用数据库update
        Drink adddrink= Drink.builder().id(1)
                .name("茉莉花茶")
                .price(Money.parse("USD 8.00"))
                .build();
        return adddrink;
    }

    /**
     * 删除
     * delete /drink/1
     */
    @DeleteMapping("/{id}")
    public String deleteDrink(@PathVariable Integer id){
        log.info("要删除的饮品id:{}",id);
        return"删除成功";
    }

    /**
     * 文件上传
     * 前端必须使用HTML form
     * 前端类型必须设置为multiport/form-data
     */
    @PostMapping(value = "/upload",consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    public String uploadFile(MultipartFile file) {
        String dest = "D:/upload/";
        String destFileName = dest + file.getOriginalFilename();
        File destFile = new File(destFileName);
        try {
            file.transferTo(destFile);
        } catch (IOException e) {
            e.printStackTrace();
            return "长传失败";
        }
        return "上传成功";
    }

    @PostMapping(value = "/batch",
            consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) //前三排就是上传
    public List<Drink> batchAddNewDrink(MultipartFile file) {
        List<Drink> results = new ArrayList<>();
        try {
            InputStream inputStream = file.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(
                            file.getInputStream()

                    )
            );
            String line = "";
            while ((line=reader.readLine())!=null){
                //解析一行
                String[]  args = line.split(",");
                Drink drink = Drink.builder()
                        .id(Integer.parseInt(args[0]))
                        .name(args[1])
                        .price(Money.of(CurrencyUnit.of("CNY"),Double.parseDouble(args[2])))
                        .build();
                results.add(drink);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return results;
    }
}

